package com.logic.landseaserver.persistence.read;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.logic.common.util.QueryUtil;
import com.logic.landseaserver.domain.Contract;
import com.logic.landseaserver.domain.RoomPwdSmsInfo;
import com.logic.landseaserver.models.amortization.bean.AmortizationRecord;
import com.logic.landseaserver.models.rentalrate.bean.RentalRateContract;
import com.logic.landseaserver.ws.dto.ContractBillDTO;
import com.logic.landseaserver.ws.dto.ContractDTO;
import com.logic.landseaserver.ws.dto.ContractMonthFeeDTO;
import com.logic.landseaserver.ws.dto.ContractPdfDTO;
import com.logic.landseaserver.ws.request.ContractNeedDelReq;
import com.logic.landseaserver.ws.request.RoomStatusStatisticReq;
import com.logic.landseaserver.ws.response.ContractResp;


public interface ContractReadMapper {
    Contract selectByPrimaryKey(Integer id);

    //c查看房间下是否有有效合同
    Integer queryApartContractCounts(Integer aprtId);

    //更具状态和用户号查询名下合同
    List<Contract> queryContractByStatus(String statusCode, Integer userId);

    //合同分页
    List<ContractDTO> queryContractPage(QueryUtil queryUtil);

    //获得合同详情
    ContractDTO queryContractDetail(Integer id);

    ContractBillDTO queryContractForBill(Integer id);

    //获得最大序列号
    Integer getMaxContractCode();

    //获取合同pdf详细信息
    ContractPdfDTO getContractPdfDTO(HashMap map);

    List<Integer> queryPdf();

    ContractResp getDetailByRoomId(Integer roomId);

    //获取电量等用量以及价格
    List<ContractMonthFeeDTO> queryContractFee(Integer contractId,String status);

    List<ContractBillDTO> queryForCreateBill(String billDate);


    /**
     * [简要描述]：根据房间Id查询合同</br>
     * [详细描述]：返回正式的合同</br>
     * [作者]：Aaron(2017-07-04)</br>
     *
     * @param roomId 房间Id
     * @return
     */
    Contract getByRoomId(Integer roomId);

    /**
     * [简要描述]：根据房间Id查询发送密码短信需要的信息</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-07-04)</br>
     *
     * @param roomId
     * @return
     */
    RoomPwdSmsInfo getSmsInfoByRoomId(Integer roomId);
    
    List<Contract> selectByRmIdAndUrId(Integer userId,Integer roomId);
    
    /**
     * 
     * [简要描述]：专为查询账户列表设计</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2018-01-12)</br>
     *
     * @param userRoomSqlString 拼装好的sql
     * @return
     *
     */
    List<Contract> select4AccountByRmIdAndUrId(Map<String,Object> queryMap);
    
    /**
     * 
     * [简要描述]：根据合同Id查询发送密码短信需要的信息</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-07-20)</br>
     *
     * @param contractId
     * @return
     *
     */
    RoomPwdSmsInfo getMsgInfoByContractId(Integer contractId);

    List<ContractNeedDelReq> needDeletedContract(Integer minutesMis);

    Integer queryContractByMoving(RoomStatusStatisticReq req);

    List<Contract> queryPDFImgIsNull();


    Integer queryChangeVersionCount(Integer adminId, Integer projectId);
    
    /**
     * 
     * [简要描述]：摊销分页查询</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-11-08)</br>
     *
     * @param queryUtil
     * @return
     *
     */
    List<AmortizationRecord> amortizationPageList(QueryUtil queryUtil);
    
    /**
     * 
     * [简要描述]：根据用户和房间查询签约中的合同</br>
     * [详细描述]：或者查询首期未支付完成的合同</br>
     * [作者]：Aaron(2017-11-29)</br>
     *
     * @param paramMap
     * @return
     *
     */
    List<Contract> queryContractWithUserRoom(Map<String,Object> paramMap);

    //获得续租合同详情
    ContractDTO queryReRentContractDetail(Integer id);

    List<Contract> queryReRentContract(HashMap queryMap);
    
    List<Contract> selectContractByStatus(String status);
    
    /**
     * 
     * [简要描述]：查询换房合同</br>
     * [详细描述]：条件：原合同ID以及renttype</br>
     * [作者]：Aaron(2017-12-13)</br>
     *
     * @param paramMap
     * @return
     *
     */
    ContractDTO queryChangeRoomContractDetail(Map<String,Object> paramMap);
    
    /**
     * 
     * [简要描述]：合同列表查询待换房的数量</br>
     * [详细描述]：</br>
     * [作者]：Aaron(2017-12-18)</br>
     *
     * @param paramMap
     * @return
     *
     */
    Integer getChangeRoomCount(Map<String,Object> paramMap);

    Integer queryChangeRentCount(Integer adminId, Integer projectId);

    List<Contract> queryCancleChaneRoom(String changeDate);

    Integer checkByUserId(Integer userId);

    List<Contract> queryUsedContract(Integer userId);
    
    // 平均出租率报表合同查询
    List<RentalRateContract> queryRentalRateContract(Map<String,Object> paramMap);

    List<ContractBillDTO> queryByIdsForCreateBill(Map<String,Object> paramMap);
}